<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title>变量对象</title>
</head>
<body>
<script type="text/javascript">
    // 变量对象(variable object):是执行上下文的一个属性
    // 是一个与执行上下文相关的特殊对象,主要包括三部分(1:变量(var,变量申明)2:函数声明(函数表达式不算)3:函数形参)
    // 只有在全局上下文的变量对象允许通过VO的属性名称来间接访问(在全局上下文里,全局对象就是变量对象),在其他上下文中是不能直接访问VO对象的,因为他是内部机制的一个实现???
//	执行上下文的生命周期
//		1:创建阶段:创建变量对象,建立作用域链,和确定this的指向
//		2:代码执行阶段:变量赋值,函数引用,执行其他代码

//	变量对象的创建，依次经历了以下几个过程。
//		1:建立arguments对象。检查当前上下文中的参数，建立该对象下的属性与属性值。(创建arguments对象)
//		2:检查当前上下文的函数声明，也就是使用function关键字声明的函数。在变量对象中以函数名建立一个属性，属性值为指向该函数所在内存地址的引用。如果函数名的属性已经存在，那么该属性将会被新的引用所覆盖。(检查function函数声明创建属性)
//		3:检查当前上下文中的变量声明，每找到一个变量声明，就在变量对象中以变量名建立一个属性，属性值为undefined。如果该变量名的属性已经存在，为了防止同名的函数被修改为undefined，则会直接跳过，原属性值不会被修改。(检查var声明创建属性)

//	函数先编译后执行,function functionName(){....}指向引用,最先编译并指向引用,console.log不会为undefined,var functionName = function(){....} 先编译后执行,会出现undefined的情况
</script>
</body>
</html>
